<?php
/**
 * Smarty plugin
 *
 * @package Smarty
 * @subpackage PluginsFilter
 */

/**
 * Smarty trimwhitespace outputfilter plugin
 *
 * File:     outputfilter.trimwhitespace.php<br>
 * Type:     outputfilter<br>
 * Name:     trimwhitespace<br>
 * Date:     Jan 25, 2003<br>
 * Purpose:  trim leading white space and blank lines from
 * template source after it gets interpreted, cleaning
 * up code and saving bandwidth. Does not affect
 * <<PRE>></PRE> and <SCRIPT></SCRIPT> blocks.<br>
 * Install:  Drop into the plugin directory, call
 * <code>$smarty->load_filter('output','trimwhitespace');</code>
 * from application.
 * @author   Monte Ohrt <monte at ohrt dot com>
 * @author Contributions from Lars Noschinski <lars@usenet.noschinski.de>
 * @version  1.3
 * @param string $source input string
 * @param object &$smarty Smarty object
 * @return string filtered output
 */
function smarty_outputfilter_trimwhitespace($source, $smarty) {
	// Pull out the script blocks
	preg_match_all ( "!<script[^>]*?>.*?</script>!is", $source, $match );
	$_script_blocks = $match [0];
	$source = preg_replace ( "!<script[^>]*?>.*?</script>!is", '@@@SMARTY:TRIM:SCRIPT@@@', $source );
	
	// Pull out the pre blocks
	preg_match_all ( "!<pre[^>]*?>.*?</pre>!is", $source, $match );
	$_pre_blocks = $match [0];
	$source = preg_replace ( "!<pre[^>]*?>.*?</pre>!is", '@@@SMARTY:TRIM:PRE@@@', $source );
	
	// Pull out the textarea blocks
	preg_match_all ( "!<textarea[^>]*?>.*?</textarea>!is", $source, $match );
	$_textarea_blocks = $match [0];
	$source = preg_replace ( "!<textarea[^>]*?>.*?</textarea>!is", '@@@SMARTY:TRIM:TEXTAREA@@@', $source );
	
	// remove all leading spaces, tabs and carriage returns NOT
	// preceeded by a php close tag.
	$source = trim ( preg_replace ( '/((?<!\?>)\n)[\s]+/m', '\1', $source ) );
	
	// replace textarea blocks
	smarty_outputfilter_trimwhitespace_replace ( "@@@SMARTY:TRIM:TEXTAREA@@@", $_textarea_blocks, $source );
	
	// replace pre blocks
	smarty_outputfilter_trimwhitespace_replace ( "@@@SMARTY:TRIM:PRE@@@", $_pre_blocks, $source );
	
	// replace script blocks
	smarty_outputfilter_trimwhitespace_replace ( "@@@SMARTY:TRIM:SCRIPT@@@", $_script_blocks, $source );
	
	return $source;
}

function smarty_outputfilter_trimwhitespace_replace($search_str, $replace, &$subject) {
	$_len = strlen ( $search_str );
	$_pos = 0;
	for($_i = 0, $_count = count ( $replace ); $_i < $_count; $_i ++)
		if (($_pos = strpos ( $subject, $search_str, $_pos )) !== false)
			$subject = substr_replace ( $subject, $replace [$_i], $_pos, $_len );
		else
			break;

}

?>